From: Jonas Dreßler Date: Tue, 8 Mar 2022 11:50:03 +0000 (+0100) Subject: magnifier: Properly hide the second (real) cursor X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~480^2^2~96 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=f13a6145fd67b583af22be04c800a9b64ef258a1;p=gnome-shell.git magnifier: Properly hide the second (real) cursor The magnifier uses a PointerWatcher (which is based on a simple timeout source) to update the zoom region based on the current mouse cursor position 60 times a second. When updating the zoom region, it would also hide mutters cursor using meta_cursor_tracker_set_pointer_visible(). Since a few months, mutter has decoupled the handling of input events from the monitor refresh rate though, which means it's no longer guaranteed that the cursor changes only 60 times a second (on higher refresh rate monitors it actually never was). This means mutter might show the cursor more often than 60 times a second, while we hide it only 60 times a second, leading to a flickering second cursor. To fix this, implement the cursor-hiding by listening to MetaCursorTrackers visibility-changed signal, and immediately hiding the cursor again when it's shown. Part-of: --- diff --git a/js/ui/magnifier.js b/js/ui/magnifier.js index c0c750e8e..0585e8812 100644 --- a/js/ui/magnifier.js +++ b/js/ui/magnifier.js @@ -126,7 +126,13 @@ var Magnifier = class Magnifier { if (seat.is_unfocus_inhibited()) seat.uninhibit_unfocus(); - this._cursorTracker.set_pointer_visible(true); + + if (this._cursorVisibilityChangedId) { + this._cursorTracker.disconnect(this._cursorVisibilityChangedId); + delete this._cursorVisibilityChangedId; + + this._cursorTracker.set_pointer_visible(true); + } } /** @@ -138,7 +144,14 @@ var Magnifier = class Magnifier { if (!seat.is_unfocus_inhibited()) seat.inhibit_unfocus(); - this._cursorTracker.set_pointer_visible(false); + + if (!this._cursorVisibilityChangedId) { + this._cursorTracker.set_pointer_visible(false); + this._cursorVisibilityChangedId = this._cursorTracker.connect('visibility-changed', () => { + if (this._cursorTracker.get_pointer_visible()) + this._cursorTracker.set_pointer_visible(false); + }); + } } /**